package com.spring.boot.core.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class ObjectCopy {

	public static Object copy(Object obj) {
		if (obj == null) {
			return null;
		}
		if (obj instanceof Collection<?>) {
			return copyToList((Collection<?>) obj);
		} else if (obj.getClass().isArray()) {
			return copyToList((Object[]) obj);
		} else {
			return copyToOne(obj);
		}
	}

	// 该方法实现对Customer对象的拷贝操作
	private static Object copyToOne(Object obj) {
		if (obj == null) {
			return null;
		}
		try {
			Class<?> classType = obj.getClass();
			Object objCopy = classType.newInstance();
			// 获得对象的所有成员变量
			Field[] fields = classType.getDeclaredFields();
			for (Field field : fields) {
				// 获取成员变量的名字
				String name = field.getName(); // 获取成员变量的名字，此处为id，name,age
				// System.out.println(name);
				// 获取get和set方法的名字
				String firstLetter = name.substring(0, 1).toUpperCase(); // 将属性的首字母转换为大写
				String getMethodName = "get" + firstLetter + name.substring(1);
				String setMethodName = "set" + firstLetter + name.substring(1);
				// System.out.println(getMethodName + "," + setMethodName);

				// 获取方法对象
				Method getMethod = classType.getMethod(getMethodName, new Class[] {});
				Method setMethod = classType.getMethod(setMethodName, new Class[] { field.getType() });// 注意set方法需要传入参数类型

				// 调用get方法获取旧的对象的值
				Object value = getMethod.invoke(obj, new Object[] {});
				// 调用set方法将这个值复制到新的对象中去
				setMethod.invoke(objCopy, new Object[] { value });

			}
			return objCopy;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;

	}

	private static Object copyToList(Collection<?> coll) {
		if (coll == null || coll.isEmpty()) {
			return coll;
		}
		try {
			List<Object> objList = new ArrayList<Object>();
			for (Object v : coll) {
				objList.add(copyToOne(v));
			}
			return objList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private static Object copyToList(Object[] array) {
		if (array == null || array.length == 0) {
			return array;
		}
		try {
			List<Object> objList = new ArrayList<Object>();
			for (Object v : array) {
				objList.add(copyToOne(v));
			}
			return objList;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
